//
//  AppDelegate.m
//  Pandora
//
//  Created by Mac Pro_C on 12-12-26.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "AppDelegate.h"
#import "PDRCore.h"
#import "PDRCommonString.h"
#import "ViewController.h"
#import "PDRCoreApp.h"
#import "PDRCoreAppManager.h"
#import "AppDelegate+IM.h"
#import "EBHUserManager.h"
#import <UserNotifications/UNUserNotificationCenter.h>
#import <UserNotifications/UserNotifications.h>
#import <RongIMKit/RongIMKit.h>
#import "DYIMModule.h"
#import "DYChatViewController.h"
#import "EBHNetWorkingManager.h"
#import "EBHUserInfoModel.h"
#import "EBHUserManager.h"

#define ENABLEAD

#if defined(ENABLEAD)
#import "DCADManager.h"
#endif

@interface AppDelegate()<UNUserNotificationCenterDelegate, PDRCoreDelegate
#if defined(ENABLEAD)
,DCADManagerDelgate
#endif
>
@property (strong, nonatomic) ViewController *h5ViewContoller;
@end

@implementation AppDelegate

@synthesize window = _window;
@synthesize rootViewController;
#pragma mark -
#pragma mark app lifecycle
/*
 * @Summary:程序启动时收到push消息
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[EBHUserManager sharedManager] localLogin];
    [self IM_config_msg];
    BOOL ret = [PDRCore initEngineWihtOptions:launchOptions
                                  withRunMode:PDRCoreRunModeNormal withDelegate:self];
    
    UIViewController* adViewController = nil;
#if defined(ENABLEAD)
    DCADManager *adManager = [DCADManager adManager];
    adManager.delegate = self;
    adViewController = [adManager getADViewController];
#endif
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window = window;
    
    ViewController *viewController = [[ViewController alloc] init];
    self.h5ViewContoller = viewController;
    
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
    self.rootViewController = navigationController;
    navigationController.navigationBarHidden = YES;
    if ( adViewController ) {
        [navigationController pushViewController:adViewController animated:NO];
    } else {
        [self startMainApp];
//        self.h5ViewContoller.showLoadingView = YES;
    }

    /**
     * 推送处理1
     */
    
    
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
        //注册推送，用于iOS8之前的系统
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    } else if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) {
        //注册推送, 用于iOS8以及iOS8之后的系统
        UIUserNotificationSettings *settings = [UIUserNotificationSettings
                                                settingsForTypes:(UIUserNotificationTypeBadge |
                                                                  UIUserNotificationTypeSound |
                                                                  UIUserNotificationTypeAlert)
                                                categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else {
        //iOS10+
        UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert
                                                 | UNAuthorizationOptionSound
                                                 | UNAuthorizationOptionBadge)
                              completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                });
                // 点击允许
                NSLog(@"注册成功");
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                    NSLog(@"%@", settings);
                }];
            } else {
                // 点击不允许
                NSLog(@"注册失败");
            }
        }];
    }
    
    
//    NSDictionary *remoteNotificationUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
//    if (remoteNotificationUserInfo) {
//        NSLog(@"推送消息 %@", remoteNotificationUserInfo);
//    }
    
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    

//    NSString * path = [NSString stringWithFormat:@"%@/Library/SplashBoard",NSHomeDirectory()];
//    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
    
//    [NSThread sleepForTimeInterval:2.0];
    
    return ret;
}


#pragma mark - core delegate
- (BOOL)interruptCloseSplash {
#if defined(ENABLEAD)
    return [[DCADManager adManager] interruptCloseSplash];//self.isAdInterruptCloseLoadingPage;
#endif
    return NO;
}
#if defined(ENABLEAD)
- (void)settingLoadEnd {
    [DCADManager adManager];
}
#endif

-(BOOL)getStatusBarHidden {
    return [self.h5ViewContoller getStatusBarHidden];
}

-(UIStatusBarStyle)getStatusBarStyle {
    return [self.h5ViewContoller getStatusBarStyle];
}
-(void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle {
    [self.h5ViewContoller setStatusBarStyle:statusBarStyle];
}

-(void)wantsFullScreen:(BOOL)fullScreen
{
    [self.h5ViewContoller wantsFullScreen:fullScreen];
}

#pragma mark -
- (void)startMainApp {
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [[PDRCore Instance] start];
    });
}

#if defined(ENABLEAD)
- (void)adManager:(DCADManager*)adManager dispalyADViewController:(UIViewController*)viewController {
    [self.rootViewController pushViewController:viewController animated:NO];
}

- (void)adManager:(DCADManager*)adManager needCloseADViewController:(UIViewController*)viewController {
    self.h5ViewContoller.showLoadingView = NO;
    [self.rootViewController popToRootViewControllerAnimated:NO];
}

- (void)adManager:(DCADManager*)adManager adIsShow:(DCADLaunch*)ad {
    [self startMainApp];
}
#endif

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
  completionHandler:(void(^)(BOOL succeeded))completionHandler{
    [PDRCore handleSysEvent:PDRCoreSysEventPeekQuickAction withObject:shortcutItem];
    completionHandler(true);
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [PDRCore handleSysEvent:PDRCoreSysEventBecomeActive withObject:nil];

    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    [PDRCore handleSysEvent:PDRCoreSysEventResignActive withObject:nil];

    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [PDRCore handleSysEvent:PDRCoreSysEventEnterBackground withObject:nil];
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [PDRCore handleSysEvent:PDRCoreSysEventEnterForeGround withObject:nil];
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}


- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [PDRCore destoryEngine];
}

#pragma mark -
#pragma mark URL
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [application registerForRemoteNotifications];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    [self application:application handleOpenURL:url];
    return YES;
}

/*
 * @Summary:程序被第三方调用，传入参数启动
 *
 */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURLWithOptions withObject:@[url,options]];
    return YES;
}
/*
 * @Summary:远程push注册成功收到DeviceToken回调
 *
 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"application--didRegisterForRemoteNotificationsWithDeviceToken[%@]", deviceToken);
    [PDRCore handleSysEvent:PDRCoreSysEventRevDeviceToken withObject:deviceToken];
    [[RCIMClient sharedRCIMClient] setDeviceTokenData:deviceToken];
}

/*
 * @Summary: 远程push注册失败
 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    [PDRCore handleSysEvent:PDRCoreSysEventRegRemoteNotificationsError withObject:error];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [PDRCore handleSysEvent:PDRCoreSysEventRevRemoteNotification withObject:userInfo];
    NSLog(@"推送消息 %@", userInfo);
    
//    if (userInfo) {
//        [[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//        [[NSUserDefaults standardUserDefaults] synchronize];
//    }
    
    NSDictionary *msgDic = [userInfo objectForKey:@"rc"];
    NSString *targetID = [msgDic objectForKey:@"fId"];//消息发送者的用户 ID。

    [EBHNetWorkingManager queryWithPath:@"/sapi/rongyun/chat" pars:@{@"to":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull response) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {
            NSLog(@"%@", response);
            NSInteger countDown = [[response objectForKey:@"expiryDate"] integerValue];

            [EBHNetWorkingManager queryWithPath:@"/sapi/hcp/sample" pars:@{@"id":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull res) {
                if (error) {
                    NSLog(@"Error: %@", error);
                } else {
                    NSLog(@"%@", res);
                    NSString * avatar = [res objectForKey:@"avatar"];
                    NSString * name = [res objectForKey:@"name"];
                    NSInteger status = [[res objectForKey:@"status"] integerValue];

                     [[EBHUserManager sharedManager] updateTargetUserInfo:name avatar:avatar targetId:targetID];

                    DYChatViewController * vc = [[DYChatViewController alloc] initWithConversationType:ConversationType_PRIVATE targetId:targetID];

                          vc.ebh_userName = name;
                          vc.ebh_CountDown = countDown;
                          vc.ebh_status = status;

                          UINavigationController * nav = (UINavigationController *)(AppDelegate *)[UIApplication sharedApplication].delegate.window.rootViewController;
                          [nav pushViewController:vc animated:YES];
                          vc.didPopBlock = ^{};

                }
            }];
        }
    }];
    
    
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
    [self application:application didReceiveRemoteNotification:userInfo];
    NSLog(@"推送消息 %@", userInfo);
    
//    if (userInfo) {
//        [[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//        [[NSUserDefaults standardUserDefaults] synchronize];
//    }
    
//    NSDictionary *msgDic = [userInfo objectForKey:@"rc"];
//    NSString *targetID = [msgDic objectForKey:@"fId"];//消息发送者的用户 ID。
//
//    [EBHNetWorkingManager queryWithPath:@"/sapi/rongyun/chat" pars:@{@"to":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull response) {
//        if (error) {
//            NSLog(@"Error: %@", error);
//        } else {
//            NSLog(@"%@", response);
//            NSInteger countDown = [[response objectForKey:@"expiryDate"] integerValue];
//
//            [EBHNetWorkingManager queryWithPath:@"/sapi/hcp/sample" pars:@{@"id":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull res) {
//                if (error) {
//                    NSLog(@"Error: %@", error);
//                } else {
//                    NSLog(@"%@", res);
//                    NSString * avatar = [res objectForKey:@"avatar"];
//                    NSString * name = [res objectForKey:@"name"];
//                    NSInteger status = [[res objectForKey:@"status"] integerValue];
//
//                     [[EBHUserManager sharedManager] updateTargetUserInfo:name avatar:avatar targetId:targetID];
//
//                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//                    [[NSUserDefaults standardUserDefaults] synchronize];
//
//                    DYChatViewController * vc = [[DYChatViewController alloc] initWithConversationType:ConversationType_PRIVATE targetId:targetID];
//
//                          vc.ebh_userName = name;
//                          vc.ebh_CountDown = countDown;
//                          vc.ebh_status = status;
//
//                          UINavigationController * nav = (UINavigationController *)(AppDelegate *)[UIApplication sharedApplication].delegate.window.rootViewController;
//                          [nav pushViewController:vc animated:YES];
//                          vc.didPopBlock = ^{};
//
//                }
//            }];
//        }
//    }];
    
    
    completionHandler(UIBackgroundFetchResultNewData);
}


/*
 * @Summary:程序收到本地消息
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    [PDRCore handleSysEvent:PDRCoreSysEventRevLocalNotification withObject:notification];
    
    NSDictionary *msgDic = [notification.userInfo objectForKey:@"rc"];
    NSString *targetID = [msgDic objectForKey:@"fId"];//消息发送者的用户 ID。

    [EBHNetWorkingManager queryWithPath:@"/sapi/hcp/sample" pars:@{@"id":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull res) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {
            NSLog(@"%@", res);
            NSString *avatar = [res objectForKey:@"avatar"];
            NSString *name = [res objectForKey:@"name"] ;
            NSInteger status = 1;
            [[EBHUserManager sharedManager] updateTargetUserInfo:name avatar:avatar targetId:targetID];

            [EBHNetWorkingManager queryWithPath:@"/sapi/rongyun/chat" pars:@{@"to":targetID} callback:^(NSError * _Nonnull error, id  _Nonnull response) {
                if (error) {
                    NSLog(@"Error: %@", error);
                } else {
                    NSLog(@"%@", response);
                    NSInteger countDown = [[response objectForKey:@"expiryDate"] integerValue];

                    DYChatViewController * vc = [[DYChatViewController alloc] initWithConversationType:ConversationType_PRIVATE targetId:targetID];

                       vc.ebh_userName = name;
                       vc.ebh_CountDown = countDown;
                       vc.ebh_status = status;

                       UINavigationController * nav = (UINavigationController *)(AppDelegate *)[UIApplication sharedApplication].delegate.window.rootViewController;
                       [nav pushViewController:vc animated:YES];
                       vc.didPopBlock = ^{};

                }
            }];
        }
    }];
    
}

@end

@implementation UINavigationController(Orient)

-(BOOL)shouldAutorotate{
    return ![PDRCore Instance].lockScreen;
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    if([self.topViewController isKindOfClass:[ViewController class]])
        return [self.topViewController supportedInterfaceOrientations];
    return UIInterfaceOrientationMaskPortrait;
}

// iOS 10+ push handle message
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSDictionary * userInfo = notification.request.content.userInfo;
    UNNotificationRequest *request = notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 前台收到远程通知:%@", userInfo);
    } else {
        // 判断为本地通知
        NSLog(@"iOS10 前台收到本地通知:{\\\\nbody:%@，\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge：%@，\\\\nsound：%@，\\\\nuserInfo：%@\\\\n}",
              body,title,subtitle,badge,sound,userInfo);
    }
    if (userInfo) {
        [[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
    // 需要执行这个方法，选择是否提醒用户，有Badge、Sound、Alert三种类型可以设置
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    UNNotificationRequest *request = response.notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 收到远程通知:%@", userInfo);
        NSString *targetID = @"xxxxxxx";
        [self goToChatWithTargetID:targetID];
    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 收到本地通知:{\\\\nbody:%@，\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge：%@，\\\\nsound：%@，\\\\nuserInfo：%@\\\\n}",
              body,title,subtitle,badge,sound,userInfo);
    }
    if (userInfo) {
        [[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    completionHandler();  // 系统要求执行这个方法
}

// go to chart
- (void)goToChatWithTargetID:(NSString *)targetID {
    DYChatViewController * vc = [[DYChatViewController alloc] initWithConversationType:ConversationType_PRIVATE targetId:targetID];
    /*vc.ebh_userName = name;
    vc.ebh_CountDown = countDown;
    vc.ebh_status = status;
     */
    UINavigationController * nav = (UINavigationController *)(AppDelegate *)[UIApplication sharedApplication].delegate.window.rootViewController;
    [nav pushViewController:vc animated:YES];
    vc.didPopBlock = ^{};
}




@end
